//
// Created by zhuanding on 2023/5/24.
//

#include <cstdlib>
#include "../01-preface/Status.h"

#define STACK_INIT_SIZE 100
#define STACKINCREMENT  10

#define MaxSize 10

typedef struct {
    ElemType data[MaxSize];   // 存放栈中元素；
    int top;    // 栈顶指针
} SqStack;


void InitStack_Sq(SqStack &S) {
    S.top = -1;   // 初始化栈顶指针
}


bool StackEmpty_Sq(SqStack S) {
    if (S.top == -1)
        return true;
    else
        return false;
}

int StackLength_Sq(SqStack S) {
    return S.top + 1;
}

bool Push_Sq(SqStack &S, ElemType x) {
    if (S.top == MaxSize - 1)
        return false;    // 栈满，报错
    S.data[++S.top] = x;  // 指针先加1，再入栈
    return true;
}

bool Pop_Sq(SqStack &S, ElemType &x) {
    if (S.top == -1)
        return false;   // 栈空，报错
    x = S.data[S.top--];  // 先出栈，指针再减1
    return true;
}


bool GetTop_Sq(SqStack S, ElemType &x) {
    if (S.top == -1)
        return false; // 栈空，报错
    x = S.data[S.top];   // x记录栈顶元素
    return true;
}

/*
 * 若采用动态分配初始化栈，则需要手动销毁栈，初始化也稍有不同，并且在栈满时，可以给顺序栈增补空间
 */
//
//typedef struct {
//    ElemType *stack;  // 存储栈的一维数组
//    int top;   // 栈顶指针
//    int stacksize;   // 当前分配的数组容量（以ElemType为单位）
//    int incrementsize;  // 增补空间（以ElemType为单位）
//} SqStack;
//
//
//void InitStack_Sq(SqStack &S, int maxsize = STACK_INIT_SIZE, int incresize = STACKINCREMENT) {
//    S.stack = (ElemType *) malloc(maxsize * sizeof(ElemType));
//    if (!S.stack) exit(OVERFLOW);
//    S.top = -1;
//    S.stacksize = maxsize;
//    S.incrementsize = incresize;
//}
//
//void DestroyStack_Sq(SqStack &S) {
//    free(S.stack);
//    S.stack = NULL;
//    S.stacksize = 0;
//    S.top = -1;
//}



int main(){
    SqStack S;
    ElemType e;
    int a[10]={0};

    printf("***********初始化顺序栈***********\n");
    InitStack_Sq(S);
    printf(">>>>>初始化成功！表长为%d\n", StackLength_Sq(S));
    printf("顺序表L的地址是%p\n", &S);
    printf("\n");

    printf("***********顺序栈插入元素***********\n");
    for (int i = 1; i <= 10; i++) {
        a[i] = i*i;
        if(Push_Sq(S, a[i])){
            printf("进栈成功！\n");
            GetTop_Sq(S,e);
            if (e)
                printf("栈顶元素为:%d\n", e);
            else
                printf("取栈顶元素失败！\n");
            printf("当前顺序栈的长度为：%d\n", StackLength_Sq(S));
            printf("--------\n");
        }else{
            printf("进栈失败!\n");
        }
    }
    printf("\n");

    printf("***********顺序栈元素出栈***********\n");
    while (!StackEmpty_Sq(S)){
        Pop_Sq(S, e);
        if(e)
            printf("%d元素出栈\n", e);
        else
            printf("出栈失败！\n");
    }
    printf("\n");
}